#include "tcp.h"

tcp::tcp(QObject *parent) : QObject(parent)
{
    sv=new QTcpServer();
    connect(sv,SIGNAL(newConnection()),this,SLOT(newConnect_handler()));
    sv->listen(QHostAddress::Any,9898);
    qDebug()<<"begin listen";

}

void tcp::newConnect_handler()
{
    qDebug()<<"new connection";
    socket=sv->nextPendingConnection();//获取监听到的socket文件
    //获得客户端的ip地址
    QHostAddress clientAddress = socket->peerAddress();
        ipv4= extractIPv4FromQHostAddress(clientAddress);


    connect(socket,&QTcpSocket::readyRead,this,[this](){
       //获取通信套接字的内容
        QByteArray data = socket->readAll();
        name = QString::fromUtf8(data); // 假设服务器发送的是UTF-8编码的数据
        qDebug()<<"receive:"<<name;
            emit dataReceived(ipv4,name); // 发射信号

    });



}

tcp::~tcp()
{}
QString tcp::extractIPv4FromQHostAddress(QHostAddress &address) {
    // 检查地址是否是 IPv6 地址
    if (address.protocol() == QAbstractSocket::IPv6Protocol) {
        // 将地址转换为字符串
        QString addressString = address.toString();
        // 检查字符串是否以 "::ffff:" 开头
        if (addressString.startsWith("::ffff:")) {
            // 去掉 "::ffff:" 前缀，并返回 IPv4 地址部分
            return addressString.mid(7); // 7 是 "::ffff:" 的长度
        }
    }
    // 如果地址不是 IPv6 映射的 IPv4 地址，则直接返回地址的字符串表示（可能是 IPv4 或纯 IPv6）
    // 或者您可以抛出一个错误，或者返回一个空字符串，取决于您的需求
    return address.toString(); // 在这里我们直接返回了地址的字符串表示
}



